package com.ytjj.qmyx.mall.service;

import com.ytjj.common.api.CommonResult;
import com.ytjj.common.model.UsersResponse;
import com.ytjj.qmyx.mall.model.*;
import com.ytjj.qmyx.mall.model.dto.SubsidyDataDto;
import com.ytjj.qmyx.mall.model.request.ProductListRequest;
import com.ytjj.qmyx.mall.model.response.*;
import com.ytjj.qmyx.mall.model.vo.ProductHelpWorkVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 商品接口
 *
 *
 * @version 1.0
 *
 */
public interface ProductService {

    /**
     * 查询商品信息
     *
     * @param id
     * @return
     */
    ProductResponse getProductById(Integer id, String modular);

    long queryTotalRank(Integer topCategoryId, String volumeStr,String platformData);

    Banker querySupplyChainBanker(Integer bankerId);

    BankerSite querySupplyChainBankerSite(Integer bankerId);

    Integer getProductBy(Integer id);

    ProductExtResponse queryProductExtInfo(Integer id);

    /**
     * 查询活动商品
     *
     * @param usersResponse
     * @return
     */
    List<SearchProductResponse> getActivityList(UsersResponse usersResponse,
                                                Integer pageNum,
                                                Integer pageSize,
                                                String type);

    List<String> selectProductName();

    int selectProduct();

    /**
     * 查询0元试用列表
     * @return
     */
    List<Product> selectExclusive(Integer pageNum,Integer pageSize,Integer type);

    /**
     * 查询0元试用列表
     * @return
     */
    List<ProductHelpWorkVo> MyExclusive(Integer pageNum, Integer pageSize, Integer type, Integer userId);

    /**
     * 查询0元试用详情
     * @return
     */
    ProductHelpWorkVo MyExclusiveId(Integer id);

    /**
     * 不检验上下架状态
     *
     * @param id
     * @return
     */
    ProductResponse queryProductById(Integer id);

    /**
     * 获取新品商品列表
     *
     * @return
     */
    List<ProductResponse> getNewProductInfoList();

    /**
     * 根据专区id获取商品信息
     *
     * @param id
     * @return
     */
    List<ProductResponse> getProductListBySpecialId(Integer id, int pageNum, int pageSize);

    /**
     * 获取商品列表
     *
     * @param type
     * @param specialId
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<ProductResponse> getProductList(String type, Integer specialId, Integer pageNum, Integer pageSize);

    /**
     * 获取商品列表(带用户信息推荐)
     *
     * @param type
     * @param specialId
     * @param pageNum
     * @param pageSize
     * @return
     */
    List<Object> getProductList(String type, Integer specialId, Integer pageNum, Integer pageSize, UsersResponse usersResponse);

    List<Object> getProductListNew(ProductListRequest request);

    /**
     * 同上面的接口区别在于这个接口限制了商品的售价
     * @param request
     * @return
     */
    List<Object> getProductListNewFixPrice(ProductListRequest request);

    /**
     * 获取相关推荐商品
     *
     * @param id
     * @param specialId
     * @return
     */
    Map<String, Object> getCorrelationProduct(Integer id, Integer specialId);

    /**
     * 获取产品规格信息
     *
     * @param productId
     * @return
     */
    ProductSpecResponse getProductSpecInfo(Integer productId, String productSpec);

    /**
     * 根据规格id获取产品规格信息
     *
     * @param specId
     * @return
     */
    ProductSpecResponse getProductSpecInfoById(Integer specId);

    ProductSpec getProductSpecById(Integer specId);


    /**
     * 商品出售之后
     *
     * @param productId
     * @param productSpecId
     * @param sum
     * @param productPrice
     */
    void sellAfter(Integer productId, Integer productSpecId, Integer sum, BigDecimal productPrice, Integer isWalletPay,
                   String tokenUsers, Integer isDirectbuy, String activityType, BigDecimal activityMax, Integer userId);


    void sellAfterOld(Integer productId, Integer productSpecId, Integer sum, BigDecimal productPrice, Integer isWalletPay,
                   String tokenUsers, Integer isDirectbuy, String activityType, BigDecimal activityMax, Integer userId);



    void sellAfter(Integer productId, Integer productSpecId, Integer sum, BigDecimal productPrice,
                   Integer isWalletPay, Integer isDirectbuy, String activityType, BigDecimal activityMax, Integer userId);

    void sellAfterOld(Integer productId, Integer productSpecId, Integer sum, BigDecimal productPrice,
                      Integer isWalletPay, Integer isDirectbuy, String activityType, BigDecimal activityMax, Integer userId);

    /**
     * 获取研究所商品列表
     *
     * @param specialId
     * @param type
     * @return
     */
    List<ProductResponse> getGraduateProductList(Integer specialId, String type);



    /**
     * 获取商品所有规格
     *
     * @param productId
     * @return
     */
    List<ProductSpecResponse> getProductSpecList(Integer productId);


    /**
     * 获取多个商品所有规格
     *
     * @param productList
     * @return
     */
    List<ProductSpecResponse> getProductsSpecList(List<Product> productList);

    /**
     * 查询商品状态
     *
     * @param productId
     * @return
     */
    Integer getProductStatusByProductId(Integer productId);

    /**
     * 获取推荐商品列表
     *
     * @param specialId
     * @param usersResponse
     * @return
     */
    List<HomeRecommendResponse> getRecommendProductList(Integer specialId, Integer pageNum, Integer pageSize, UsersResponse usersResponse, String activityType);

    /**
     * 获取推荐图片
     *
     * @param id
     * @return
     */
    List<ProductRecommendImgResponse> getRecommendImgByIdV2(Integer id);

    /**
     * 获取推荐图片
     *
     * @param id
     * @return
     */
    List<ProductImg> getRecommendImgById(Integer id);

    /**
     * 获取推荐图片
     *
     * @param productId
     * @return
     */
    List<ProductRecommendImgResponse> getRecommendActivityImgById(Integer productId);

    /**
     * 根据活动类型获取按钮信息
     *
     * @param activityType
     * @return
     */
    PageButton getPageButton(String activityType);

    /**
     * 转换按钮描述
     *
     * @param activityResponse
     * @param usersResponse
     * @return
     */
    String getCopywriter(ProductResponse activityResponse, UsersResponse usersResponse);

    String getCopywriter(ProductExtResponse activityResponse, UsersResponse usersResponse);


    /**
     * 获取首页商品推荐列表
     *
     * @return
     */
    List<ProductResponse> getHomeRecommendProductList();

    /**
     * 获取首页大图
     *
     * @return
     */
    List<ProductResponse> getHomeRecommendProductV2List();

    /**
     * 获取专区推荐商品
     *
     * @param specialId
     * @return
     */
    List<ProductResponse> getSpecialRecommendProduct(Integer specialId);

    /**
     * 获取商品信息
     *
     * @param productId
     * @param userId
     * @return
     */
    ProductResponse getProductByIdV2(Integer productId, int userId, String modular);

    /**
     * @Description 获取Es推荐商品
     *
     *
     * @Version 1.0
     **/
    List<SearchProductResponse> getEsRecommendProductList(Integer productId, UsersResponse currentUser, String type, String name, String activityType);

    /**
     * @Description 获取Es推荐《下架》商品
     *
     *
     * @Version 1.0
     **/
    List<SearchProductResponse> getEsRecommendProductListDown(Integer productId, UsersResponse currentUser, String type, String name, String activityType);


    /**
     * 热推荐商品
     *
     * @param currentUser
     * @return
     */
    List<SearchProductResponse> getHotRecommend(UsersResponse currentUser, Integer pageNum, Integer pageSize, String type);


    /**
     * 大图浏览记录
     *
     * @param productId
     * @param activityType
     * @param userId
     */
    void recordProductBrowe(Integer productId, String activityType, Integer userId, String pageSourceV2);

    List<ProductReviewsResponse> getProductReviews(Integer productId);

    BuyRecordResponse getBuyRecordById(Integer productId);

    /**
     * 获取专区的新品推荐和广告图
     *
     * @return
     */
    Map<String, Object> getNewProductsAndBanner(Integer specialId);

    /**
     * 获取专区的新品推荐和广告图(new 直接通过专区id找商品)
     *
     * @return
     */
    Map<String, Object> getNewProductsAndBannerNew(Integer specialId);

    List<Product> getNewProductsAndBannerNewWay2(ProductListRequest request);

    List<Product> queryGuessLikeByActivity(Integer pageNum, Integer pageSize, Integer productId, String activityType);

    List<Product> queryGuessLikeByNormal(Integer pageNum, Integer pageSize, Integer productId);

    /**
     * 获取商品列表
     *
     * @param pageNum
     * @param pageSize
     * @param productName 产品名称
     * @return
     */
    CommonResult getList(Integer pageNum, Integer pageSize, String productName);

    List<ProductShortResponse> getBrandPdInProductDetails(Integer productId);

    List<ProductShortResponse> getFeikePdInProductDetails();


    List<ProductResponse> getConfigProductList(String key);

    List<ProductResponse> getSpecialProductList(Integer pageNum, Integer pageSize, Integer specialId,String activityType,String platformData,String consumerPower);

    /**
     * 查询活动商品
     * @param activityType 活动类型
     * @param limit 查询多少条
     * @return
     */
    List<ProductResponse> getProductByActivityTypeAndLimit(String activityType, Integer limit);


    CommonResult getHighestVolumeProduct();

    String selectProductImagesByActivityTypeLimit(String activityType, Integer size);

    List<Product> selectProductByActivityTypeLimit(String activityType, Integer size);

//    List<Product> selectProductImagesByActivityType(List<String> activityTypes);

    Integer sumProductVolumeByActivityType(String activityType);

    String analysisFrontCategoryName(Integer topCategoryId, Integer categoryId, Integer bottomCategoryId);

    String selectProductTopCategoryName(Integer topCategoryId);

    void savaRedpacket(Integer productId);
}
